package com.cloud.springcloudhysyrix.consumer;

import com.netflix.hystrix.HystrixCommand;
import com.netflix.hystrix.HystrixCommandGroupKey;
import org.springframework.web.client.RestTemplate;

/**
 *
 * 我们在方式二里面实现 请求缓存。
 * 这个类是把 HelloServiceCommand 这个类复制了一份。
 * 只不过多重写了 getCacheKey() 这个父类方法
 *
 *
 *  方式二：
 * 在这里实现手动的方式完成@HystrixCommand注解所要完成的事情。
 *
 *
 *
 * weiximei on 2018/5/6
 */
public class HelloServiceCommandCache extends HystrixCommand<String> {

    private RestTemplate restTemplate;

    // 由于这个构造方法无法满足，在下面进行重构
//    protected HelloServiceCommand(HystrixCommandGroupKey group) {
//        super(group);
//    }

    protected HelloServiceCommandCache(String commandGroupKey, RestTemplate restTemplate) {
        super(HystrixCommandGroupKey.Factory.asKey(commandGroupKey));
        this.restTemplate = restTemplate;
    }

    @Override
    protected String run() throws Exception {
        System.out.println(Thread.currentThread().getName());
        return restTemplate.getForEntity("http://HELLO-SERVICE/hello",String.class).getBody();
    }

    @Override
    protected String getFallback() {
        return "error";
    }


    /**
     * 开启请求缓存，只需重载getCacheKey方法
     * 因为我们这里使用的是id，不同的请求来请求的时候会有不同cacheKey所以，同一请求第一次访问会调用，之后都会走缓存
     * 好处：    1.减少请求数、降低并发
     *          2.同一用户上下文数据一致
     *          3.这个方法会在run()和contruct()方法之前执行，减少线程开支
     */
    /**
     * 这是获取缓存的key的方法.
     *   HelloServiceCommandCache commandCache = new HelloServiceCommandCache("hello",restTemplate);
     *   也就是我上面在其他类中 new 出的，通过构造参数，注入的一个"hello"这个名字，那么这个名字就是一个key。
     *
     *  把这个key缓存起来，只需要保证同一个请求返回的是同一个Key即可。
     *
     * @return
     */
    @Override
    protected String getCacheKey() {

        // 在这里这是演示，所以直接返回一个固定值
        return "hello";
    }
}
